/************************************************************
 * Project Name		[Thinking_In_Java]
 * File Name     	[pkg_01_basic_grammar.Example_02_DataType.java]
 * Creation Date 	[12-Jun-2014]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ************************************************************/
package pkg_01_basic_grammar;

/**
 * 基本数据类型
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 * 
 */
@SuppressWarnings("unused")
public class Example_02_DataType {

	// 声明八种基本数据类型
	private byte byteType = 10;
	private short shortType = 10;
	private int intType = 10;
	private long longType = 10L;

	private float floatType = 10.0F;
	private double doubleType = 10.0;

	private char charType = 'A';

	private boolean booleanType = true;

	/**
	 * 基本类型的自动转换
	 * 
	 * 自动类型转换的规则: 两种类型是兼容类型; 目标类型的范围要比源类型的范围大
	 */
	public static void autoConvert() {
		char c = 'c';
		byte b = 44;
		short s = b;
		int i1 = s;
		int i2 = c;
		long l = i1;
		float f = l;
		double d = f;
		System.out.println("char c = " + c);
		System.out.println("byte b = " + b);
		System.out.println("short s = " + s);
		System.out.println("int i1 = " + i1);
		System.out.println("int i2 = " + i2);
		System.out.println("long l = " + l);
		System.out.println("float f = " + f);
		System.out.println("double d = " + d);
		System.out.println();

		/*
		 * 当float转换为double时, 会出现不相等的情况
		 * 
		 * 原因:float是32位的, double是64位的, 在进行类型转换的时候, 操作数都是以二进制的形式进行的,
		 * 而浮点型无法用二进制精确表示, 所以在类型转换时出现不相等的情况
		 */
		float f2 = 1.7F;
		double d2 = f2;
		System.out.println("f2 = " + f2 + "\td2 = " + d2);
		float f3 = (float) d2;
		System.out.println("f3 = " + f3);
	}

	/**
	 * 基本类型的强制类型转换
	 * 
	 * 强制类型转换的规则: 当两种类型不兼容或者, 目标类型比源类型的范围小, 就要进行强制类型转换
	 * 
	 * 转化时会发生"截断取模"的现象
	 */
	public static void forceConvert() {
		double d = 123.45D;
		float f = (float) d;
		long l = (long) d;
		int i = (int) d;
		short s = (short) d;
		byte b = (byte) d;

		System.out.println("double d = " + d);
		System.out.println("float f = " + f);
		System.out.print("long l = " + l);
		System.out.print("int i = " + i);
		System.out.print("short s = " + s);
		System.out.print("byte b = " + b);

		/*
		 * 首先对d2进行截断操作, 值变为567, 然后对128进行取模, 得到结果
		 */
		double d2 = 567.8D;
		b = (byte) d2;
		System.out.println(b);
	}

	/**
	 * 基本类型的自动提升
	 * 
	 * 自动提升的规则如下:
	 * 
	 * 如果两个操作数中有一个是double类型, 则系统先将另一个操作数转换为double类型, 然后运算, 否则<br>
	 * 如果两个操作数中有一个是float类型, 则系统先将另一个操作数转换为float类型, 然后运算, 否则 <br>
	 * 如果两个操作数中有一个是long类型, 则系统先将另一个操作数转换为long类型, 然后运算, 否则 <br>
	 * 所有的操作数都被转换为int类型进行运算(低于int类型的会自动提升)
	 * 
	 * 如果采用"+=","*="等缩略形式的运算符, 则系统会强制将运算结果转换为目标变量类型
	 * 
	 */
	public static void typeAutoUpgrade() {
		char c = 'a';
		byte b = 44;
		short s = 1023;
		int i = 40000;
		long l = 1234L;
		float f = 35.6F;
		double d = 3.13D;

		double result = (b * f) + (f * l) + (i / c) - (d * s);
		System.out.println("自动类型提升的测试结果为: " + result);
	}

	public static void main(String[] args) {
		Example_02_DataType.autoConvert();
		Example_02_DataType.forceConvert();
		Example_02_DataType.typeAutoUpgrade();
	}
}
